Loading Libraries
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.4 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
# install.packages("vtable")
library(vtable)
## Loading required package: kableExtra
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
# install.packages("Hmisc")
library("Hmisc")
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
# install.packages("corrplot")
library(corrplot)
## corrplot 0.92 loaded
library(naniar)
library(corrplot)
library(stargazer)
##
## Please cite as:
## Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
library(htmltools)
library(AER)
## Loading required package: car
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: sandwich
library(plm)
##
## Attaching package: 'plm'
## The following objects are masked from 'package:dplyr':
##
## between, lag, lead
library("imputeTS")
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Attaching package: 'imputeTS'
## The following object is masked from 'package:zoo':
##
## na.locf
Loading Data
df <- read_csv("../../data/final/merged_data.csv")
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## .default = col_double(),
## iso = col_character(),
## country_name = col_character(),
## hdi_value = col_character()
## )
## ℹ Use `spec()` for the full column specifications.
adb <- read_csv("../../data/final/adb-members.csv")
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## country_name = col_character(),
## iso = col_character(),
## region = col_character(),
## donor = col_double(),
## sids = col_double(),
## ldc = col_double()
## )
output.fig.dir <- "../../output/figures"
output.tab.dir <- "../../output/tables"
SAVE.RESULTS <- TRUE
df <- df %>%
rename(
migrant_stock = ims_both_sex,
refugee_stock = estimated_refugee_stock_incl_asylum_seekers_both_sexes,
disaster_displacement = disaster_stock_displacementr_raw,
conflict_displacement = conflict_stock_displacement_raw,
climate_change = CCH,
air_quality = AIR,
rule_of_law = `value.Rule of Law: Estimate`,
gov_effectiveness = `value.Government Effectiveness: Estimate`,
corruption_control = `value.Control of Corruption: Estimate`,
state_legit = `P1: State Legitimacy`,
cpa_d_12 = D12,
cpa_d_avg = D_avg,
gdp = `GDP per capita (constant 2015 US$)`,
gini = `value.Gini index (World Bank estimate)`
) %>%
mutate(
conflict_displacement = conflict_displacement / 10000,
disaster_displacement = disaster_displacement / 10000,
migrant_stock = migrant_stock / 10000,
refugee_stock = refugee_stock / 10000,
gdp = gdp / 1000,
state_legit = 10 - state_legit,
hdi_value = as.numeric(hdi_value)
)
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
col_names <- c(
"migrant_stock" = "Migrant Stock (10,000s)",
"refugee_stock" = "Refugee Stock (10,000s)",
"disaster_displacement" = "Internal Displacement Due to Disasters (10,000s)",
"conflict_displacement" = "Internal Displacement Due to Conflict (10,000s)",
"climate_change" = "Climate Change",
"air_quality" = "Air Quality",
"rule_of_law" = "Rule of Law",
"gov_effectiveness" = "Government Effectiveness",
"corruption_control" = "Control of Corruption",
"state_legit" = "State Legitimacy",
"cpa_d_12" = "CPA: D-12",
"cpa_d_avg" = "CPA: Cluster D Average",
"gdp" = "GDP Per Capita (1,000s)",
"hdi_value" = "HDI",
"gini" = "Gini Index"
)
generic.cols <- c("iso", "year", "country_name", "region", "donor", "sids", "ldc")
outcome.cols <- c("state_legit", "cpa_d_avg", "cpa_d_12")
keep <- df %>%
arrange(year, iso) %>%
select(names(col_names)) %>%
mutate(keep = if_any(everything(), ~ !is.na(.))) %>%
pull(keep)
df <- df %>%
arrange(year, iso) %>%
select(iso, year, names(col_names)) %>%
arrange(year) %>%
filter(keep) %>%
left_join(adb, by = "iso")
Dependent variables across time
With both donors and recipients, across regions
for (reg in unique(df$region)) {
for (outcome in outcome.cols) {
y.lim <- 5
if (outcome == "state_legit") {
y.lim <- 10
}
plt <- df %>%
filter(region == reg) %>%
select("iso", "year", outcome) %>%
drop_na() %>%
ggplot(aes_string(x = "year", outcome)) +
geom_line(aes(color = iso)) +
geom_point(aes(color = iso)) +
labs(title = reg, subtitle = paste(col_names[outcome], "across years")) +
ylim(0, y.lim) +
theme_classic()
print(plt)
if (SAVE.RESULTS) {
ggsave(paste(output.fig.dir, "/year_X_", outcome, "_", tolower(str_replace(reg, " ", "-")), ".png", sep = ""))
}
}
}
## Note: Using an external vector in selections is ambiguous.
## ℹ Use `all_of(outcome)` instead of `outcome` to silence this message.
## ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

With only recipients, across regions
for (reg in unique(df$region)) {
for (outcome in outcome.cols) {
y.lim <- 5
if (outcome == "state_legit") {
y.lim <- 10
}
plt <- df %>%
filter(region == reg & donor == 0) %>%
select("iso", "year", outcome) %>%
drop_na() %>%
ggplot(aes_string(x = "year", outcome)) +
geom_line(aes(color = iso)) +
geom_point(aes(color = iso)) +
labs(title = reg, subtitle = paste(col_names[outcome], "across years")) +
ylim(0, y.lim) +
theme_classic()
print(plt)
if (SAVE.RESULTS) {
ggsave(paste(output.fig.dir, "/year_X_", outcome, "_", tolower(str_replace(reg, " ", "-")), "_recipients", ".png", sep = ""))
}
}
}
## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

Across donor and recipient countries
for (status in c("Donors", "Recipients")) {
for (outcome in outcome.cols) {
y.lim <- 5
if (outcome == "state_legit") {
y.lim <- 10
}
plt <- df %>%
mutate(donor = ifelse(donor, "Donors", "Recipients")) %>%
filter(donor == status) %>%
select("iso", "year", outcome) %>%
drop_na() %>%
ggplot(aes_string(x = "year", outcome)) +
geom_line(aes(color = iso)) +
geom_point(aes(color = iso)) +
labs(title = status, subtitle = paste(col_names[outcome], "across years")) +
ylim(0, y.lim) +
theme_classic()
print(plt)
if (SAVE.RESULTS) {
ggsave(paste(output.fig.dir, "/year_X_", outcome, "_", tolower(status), ".png", sep = ""))
}
}
}
## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

Paired Scatterplots
## Note: Using an external vector in selections is ambiguous.
## ℹ Use `all_of(generic.cols)` instead of `generic.cols` to silence this message.
## ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
## Note: Using an external vector in selections is ambiguous.
## ℹ Use `all_of(col)` instead of `col` to silence this message.
## ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image
## Warning in max(sdf$year): no non-missing arguments to max; returning -Inf
## Warning in min(sdf$year): no non-missing arguments to min; returning Inf
## Warning in max(sdf$year): no non-missing arguments to max; returning -Inf
## Warning in min(sdf$year): no non-missing arguments to min; returning Inf

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Warning: ggrepel: 7 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Saving 7 x 5 in image
## Warning: ggrepel: 7 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

## Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Saving 7 x 5 in image
## Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

Fixed Effects Regression
Without imputing missing data
climate.model <- plm(state_legit ~ air_quality + climate_change + gdp, data = df, index = c("iso", "year"), model = "within", effect = "twoways")
migration.model <- plm(state_legit ~ migrant_stock + refugee_stock + conflict_displacement + disaster_displacement + gdp, data = df, index = c("iso", "year"), model = "within", effect = "twoways")
governance.model <- plm(state_legit ~ rule_of_law + gov_effectiveness + corruption_control + gdp, data = df, index = c("iso", "year"), model = "within", effect = "twoways")
full.model <- plm(state_legit ~ rule_of_law + gov_effectiveness + corruption_control + conflict_displacement + disaster_displacement + climate_change + air_quality + gdp, data = df, index = c("iso", "year"), model = "within", effect = "twoways")
stargazer(climate.model, migration.model, governance.model, full.model, type = "text")
##
## =======================================================================================================
## Dependent variable:
## ---------------------------------------------------------------------------------
## state_legit
## (1) (2) (3) (4)
## -------------------------------------------------------------------------------------------------------
## air_quality 0.001 0.005
## (0.004) (0.005)
##
## climate_change -0.004 -0.003
## (0.003) (0.004)
##
## migrant_stock -0.001
## (0.004)
##
## refugee_stock 0.003
## (0.008)
##
## conflict_displacement -0.003 -0.002
## (0.002) (0.003)
##
## disaster_displacement 0.008* 0.004
## (0.004) (0.005)
##
## rule_of_law -0.098 0.079
## (0.228) (0.572)
##
## gov_effectiveness -0.438** -0.347
## (0.191) (0.399)
##
## corruption_control 0.869*** 0.307
## (0.179) (0.426)
##
## gdp -0.055 -0.134 -0.046** -0.167*
## (0.046) (0.095) (0.022) (0.085)
##
## -------------------------------------------------------------------------------------------------------
## Observations 216 116 562 172
## R2 0.023 0.109 0.063 0.074
## Adjusted R2 -0.243 -0.423 -0.039 -0.298
## F Statistic 1.341 (df = 3; 169) 1.766 (df = 5; 72) 8.476*** (df = 4; 506) 1.221 (df = 8; 122)
## =======================================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
if (SAVE.RESULTS) {
stargazer(climate.model, migration.model, governance.model, full.model, type = "html", out = paste(output.tab.dir, "/state_legit_reg_fe.html", sep = ""))
}
##
## <table style="text-align:center"><tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="4"><em>Dependent variable:</em></td></tr>
## <tr><td></td><td colspan="4" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td colspan="4">state_legit</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">air_quality</td><td>0.001</td><td></td><td></td><td>0.005</td></tr>
## <tr><td style="text-align:left"></td><td>(0.004)</td><td></td><td></td><td>(0.005)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">climate_change</td><td>-0.004</td><td></td><td></td><td>-0.003</td></tr>
## <tr><td style="text-align:left"></td><td>(0.003)</td><td></td><td></td><td>(0.004)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">migrant_stock</td><td></td><td>-0.001</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.004)</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">refugee_stock</td><td></td><td>0.003</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.008)</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">conflict_displacement</td><td></td><td>-0.003</td><td></td><td>-0.002</td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.002)</td><td></td><td>(0.003)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">disaster_displacement</td><td></td><td>0.008<sup>*</sup></td><td></td><td>0.004</td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.004)</td><td></td><td>(0.005)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">rule_of_law</td><td></td><td></td><td>-0.098</td><td>0.079</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.228)</td><td>(0.572)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">gov_effectiveness</td><td></td><td></td><td>-0.438<sup>**</sup></td><td>-0.347</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.191)</td><td>(0.399)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">corruption_control</td><td></td><td></td><td>0.869<sup>***</sup></td><td>0.307</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.179)</td><td>(0.426)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">gdp</td><td>-0.055</td><td>-0.134</td><td>-0.046<sup>**</sup></td><td>-0.167<sup>*</sup></td></tr>
## <tr><td style="text-align:left"></td><td>(0.046)</td><td>(0.095)</td><td>(0.022)</td><td>(0.085)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>216</td><td>116</td><td>562</td><td>172</td></tr>
## <tr><td style="text-align:left">R<sup>2</sup></td><td>0.023</td><td>0.109</td><td>0.063</td><td>0.074</td></tr>
## <tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>-0.243</td><td>-0.423</td><td>-0.039</td><td>-0.298</td></tr>
## <tr><td style="text-align:left">F Statistic</td><td>1.341 (df = 3; 169)</td><td>1.766 (df = 5; 72)</td><td>8.476<sup>***</sup> (df = 4; 506)</td><td>1.221 (df = 8; 122)</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="4" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## </table>
Imputing climate_change and air_quality variables
df.imp <- df
for (col in c("air_quality", "climate_change")) {
for (country in unique(df.imp$iso)) {
if (sum(!is.na(df.imp[(df.imp$iso == country), col])) >= 3) {
df.imp[df.imp$iso == country & df.imp$year >= 2006, col] <- na_interpolation(df.imp[df.imp$iso == country & df.imp$year >= 2006, col])
} else {
print(paste(col, "-", country))
}
}
}
## [1] "air_quality - COK"
## [1] "air_quality - HKG"
## [1] "air_quality - NIU"
## [1] "air_quality - NRU"
## [1] "air_quality - TUV"
## [1] "climate_change - AFG"
## [1] "climate_change - COK"
## [1] "climate_change - FSM"
## [1] "climate_change - HKG"
## [1] "climate_change - MHL"
## [1] "climate_change - NIU"
## [1] "climate_change - NRU"
## [1] "climate_change - PLW"
## [1] "climate_change - TLS"
## [1] "climate_change - TUV"
if (SAVE.RESULTS) {
write_csv(df.imp, "../../data/final/merged_data_imputed.csv")
}
climate.model <- plm(state_legit ~ air_quality + climate_change + gdp, data = df.imp, index = c("iso", "year"), model = "within", effect = "twoways")
migration.model <- plm(state_legit ~ migrant_stock + refugee_stock + conflict_displacement + disaster_displacement + gdp, data = df.imp, index = c("iso", "year"), model = "within", effect = "twoways")
governance.model <- plm(state_legit ~ rule_of_law + gov_effectiveness + corruption_control + gdp, data = df.imp, index = c("iso", "year"), model = "within", effect = "twoways")
full.model <- plm(state_legit ~ rule_of_law + gov_effectiveness + corruption_control + conflict_displacement + disaster_displacement + climate_change + air_quality + gdp, data = df.imp, index = c("iso", "year"), model = "within", effect = "twoways")
stargazer(climate.model, migration.model, governance.model, full.model, type = "text")
##
## =============================================================================================================
## Dependent variable:
## ---------------------------------------------------------------------------------------
## state_legit
## (1) (2) (3) (4)
## -------------------------------------------------------------------------------------------------------------
## air_quality 0.001 0.009***
## (0.002) (0.003)
##
## climate_change -0.006*** -0.006**
## (0.002) (0.003)
##
## migrant_stock -0.001
## (0.004)
##
## refugee_stock 0.003
## (0.008)
##
## conflict_displacement -0.003 -0.002
## (0.002) (0.002)
##
## disaster_displacement 0.008* 0.005
## (0.004) (0.004)
##
## rule_of_law -0.098 0.021
## (0.228) (0.343)
##
## gov_effectiveness -0.438** -0.485**
## (0.191) (0.228)
##
## corruption_control 0.869*** 0.752***
## (0.179) (0.249)
##
## gdp -0.037 -0.134 -0.046** -0.138**
## (0.023) (0.095) (0.022) (0.055)
##
## -------------------------------------------------------------------------------------------------------------
## Observations 525 116 562 366
## R2 0.031 0.109 0.063 0.115
## Adjusted R2 -0.080 -0.423 -0.039 -0.042
## F Statistic 4.989*** (df = 3; 470) 1.766 (df = 5; 72) 8.476*** (df = 4; 506) 5.035*** (df = 8; 310)
## =============================================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
if (SAVE.RESULTS) {
stargazer(climate.model, migration.model, governance.model, full.model, type = "html", out = paste(output.tab.dir, "/state_legit_reg_fe_imputed.html", sep = ""))
}
##
## <table style="text-align:center"><tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="4"><em>Dependent variable:</em></td></tr>
## <tr><td></td><td colspan="4" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td colspan="4">state_legit</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">air_quality</td><td>0.001</td><td></td><td></td><td>0.009<sup>***</sup></td></tr>
## <tr><td style="text-align:left"></td><td>(0.002)</td><td></td><td></td><td>(0.003)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">climate_change</td><td>-0.006<sup>***</sup></td><td></td><td></td><td>-0.006<sup>**</sup></td></tr>
## <tr><td style="text-align:left"></td><td>(0.002)</td><td></td><td></td><td>(0.003)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">migrant_stock</td><td></td><td>-0.001</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.004)</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">refugee_stock</td><td></td><td>0.003</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.008)</td><td></td><td></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">conflict_displacement</td><td></td><td>-0.003</td><td></td><td>-0.002</td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.002)</td><td></td><td>(0.002)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">disaster_displacement</td><td></td><td>0.008<sup>*</sup></td><td></td><td>0.005</td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.004)</td><td></td><td>(0.004)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">rule_of_law</td><td></td><td></td><td>-0.098</td><td>0.021</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.228)</td><td>(0.343)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">gov_effectiveness</td><td></td><td></td><td>-0.438<sup>**</sup></td><td>-0.485<sup>**</sup></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.191)</td><td>(0.228)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">corruption_control</td><td></td><td></td><td>0.869<sup>***</sup></td><td>0.752<sup>***</sup></td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td>(0.179)</td><td>(0.249)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">gdp</td><td>-0.037</td><td>-0.134</td><td>-0.046<sup>**</sup></td><td>-0.138<sup>**</sup></td></tr>
## <tr><td style="text-align:left"></td><td>(0.023)</td><td>(0.095)</td><td>(0.022)</td><td>(0.055)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>525</td><td>116</td><td>562</td><td>366</td></tr>
## <tr><td style="text-align:left">R<sup>2</sup></td><td>0.031</td><td>0.109</td><td>0.063</td><td>0.115</td></tr>
## <tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>-0.080</td><td>-0.423</td><td>-0.039</td><td>-0.042</td></tr>
## <tr><td style="text-align:left">F Statistic</td><td>4.989<sup>***</sup> (df = 3; 470)</td><td>1.766 (df = 5; 72)</td><td>8.476<sup>***</sup> (df = 4; 506)</td><td>5.035<sup>***</sup> (df = 8; 310)</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="4" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## </table>